from datetime import datetime
import traceback
from typing import Union

from mcp.server.fastmcp import FastMCP
from common.configuration import get_system_settings, get_ruge_settings, get_test_settings
import common.logger as logger
from common.ruge import find_nacos_service_host
import requests

mcp = FastMCP("IoT-MCP-Service", port=get_system_settings("web_port"))


@mcp.tool()
async def get_ymd_timestamp(date_str: str) -> int:
    """
    获取指定年月日对应的时间戳(秒)

    参数：
        date_str: 要转换成时间戳的年月日，格式：YYYY年MM月DD日，比如：2025年4月1日

    返回：
    时间戳(秒)
    """
    try:
        # 将输入的日期字符串转换为 datetime 对象
        input_date = datetime.strptime(date_str, '%Y年%m月%d日')
        # 设置时间为 0 点
        midnight = input_date.replace(hour=0, minute=0, second=0, microsecond=0)
        # 获取时间戳
        return midnight.timestamp()
    except Exception as e:
        logger.error(f"获取指定年月日对应的时间戳时出错: {e}")
        traceback.print_exc()
        return None


@mcp.tool()
async def get_current_timestamp() -> int:
    """
    获取当前时间戳(秒)

    返回：
    当前时间的时间戳(秒)
    """
    try:
        # 获取时间戳
        return int(datetime.now().timestamp())
    except Exception as e:
        logger.error(f"获取当前时间戳时出错: {e}")
        traceback.print_exc()
        return None


@mcp.tool()
async def get_formatted_now() -> str:
    """
    获取可读格式的当前时间

    返回：
    当前时间，格式："年-月-日 时:分:秒"
    """
    try:
        # 获取当前时间
        now = datetime.now()
        # 格式化当前时间为年-月-日 时:分:秒
        formatted_time = now.strftime("%Y-%m-%d %H:%M:%S")
        # 获取时间戳
        return formatted_time
    except Exception as e:
        logger.error(f"获取可读格式的当前时间时出错: {e}")
        traceback.print_exc()
        return None


@mcp.tool()
async def get_formatted_time(timestamp: int) -> str:
    """
    将指定的时间截，转换成可读格式

    返回：
    格式化后的时间，格式："年-月-日 时:分:秒"
    """
    try:
        # 将毫秒级时间载，转为秒
        if len(str(timestamp)) > 10:
            timestamp = timestamp // 1000
        # 将时间戳转换为datetime对象
        datetime_obj = datetime.fromtimestamp(timestamp)
        # 格式化当前时间为年-月-日 时:分:秒
        formatted_time = datetime_obj.strftime("%Y-%m-%d %H:%M:%S")
        # 获取时间戳
        return formatted_time
    except Exception as e:
        logger.error(f"获取可读格式的时间时出错: {e}")
        traceback.print_exc()
        return None


@mcp.tool()
async def get_user_info(auth_token: str) -> dict:
    """
    通过用户登录的令牌，获取用户信息

    参数：
        auth_token: 用户登录的令牌

    返回：
    返回用户信息，JSON格式
    包含的字段如下(括号中的是字段描述)：
        auth_token(用户登录的令牌)
        user_id(用户ID)
        user_account(用户账号)
        tenant_id(租户ID)

    重要提醒：当请求失败时，返回None，你应该直接告知用户获取信息失败，不可以编造用户信息
    """
    try:
        # 环境信息
        ruge_env = get_ruge_settings("env")
        # 非本地调试，从注册中心获取host
        if ruge_env != 'local':
            sso_host = find_nacos_service_host(f"isso-{ruge_env}")
        else:
            # 本地调试，从测试配置中获取host
            sso_host = get_test_settings("sso_host")
        service_url = f"http://{sso_host}/saas/sso/inner/session/get?token={auth_token}"
        logger.debug(f"Request to: {service_url}")
        response = requests.get(url=service_url).json()
        tenant_id = response["tenantId"]
        # 当前用户拥有的租户列表
        tenantIdSet = response["tenantIdSet"]
        # 如果租户ID为空，则从取租户列表第一个租户(大部分用户只有一个租户，所以用这个逻辑实现获取用户上一次登录租户的效果)
        if tenant_id is None and len(tenantIdSet) > 0:
            tenant_id = tenantIdSet[0]
        user_info = {
            "auth_token": auth_token,
            "user_id": response["userId"],
            "user_account": response["userAccount"],
            "tenant_id": tenant_id
        }
        return user_info
    except Exception as e:
        logger.error(f"获取用户信息时出错: {e}")
        traceback.print_exc()
        return None


@mcp.tool()
async def subtract(a: Union[int, float], b: Union[int, float]):
    """
    减法运算，计算两个数的差值

    参数：
        a: 第一个数
        b: 第二个数

    返回：
    a和b的差值

    重要提醒：为了保证计算的严谨性，所有减法运算，都必须使用此方法计算，不允许在思考过程中计算
    """
    return a - b
